package com.alfred.springboot.elasticjob.lite.core.annotation;

import com.alfred.springboot.elasticjob.lite.common.constants.StringPool;
import com.dangdang.ddframe.job.api.JobType;

import java.lang.annotation.*;

/**
 * ElasticJob注释
 * 用途：对Job进行注释配置
 */
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
@Documented
public @interface ElasticJob {

    // 作业类型
    JobType jobType() default JobType.SIMPLE;

    // 作业名称
    String jobName();

    // corn表达式 用于控制作业触发时间
    String corn();

    // 作业分片总数
    int shardingTotalCount();

    // 分片参数
    String shardingItemParameters();

    // 作业自定义参数 可通过传递该参数为作业调度的业务方法传参，用于实现带参数的作业 例：每次获取的数据量、作业实例从数据库读取的主键等
    String jobParameter() default "pageSize=20";

    // 是否开启任务执行失效转移 开启表示如果作业在一次任务执行中途宕机，允许将该次未完成的任务在另一作业节点上补偿执行
    boolean failover() default false;

    // 是否开启错过任务重新执行 默认启用
    boolean misfire() default true;

    // 作业描述信息
    String description() default "";

    // 作业实现类 需实现ElasticJob接口
    String jobClass() default "";

    //~~ JobProperties 属性 BEGIN ~~
    // 作业异常处理器 应用于JobProperties
    String jobExceptionHandler() default StringPool.DEFAULT_JOB_EXCEPTION_HANDLER_CLASS;

    // service处理器 应用于JobProperties
    String executorServiceHandler() default StringPool.DEFAULT_JOB_EXECUTOR_HANDLER_CLASS;
    //~~ JobProperties 属性 END   ~~

    //~~ LiteJobConfiguration 属性 BEGIN ~~
    // 监控作业运行时状态 每次作业执行时间和间隔时间均非常短的情况，建议不监控作业运行时状态以提升效率。因为是瞬时状态，所以无必要监控。
    boolean monitorExecution() default true;

    // 最大允许的本机与注册中心的时间误差秒数 配置为-1表示不校验时间误差
    int maxTimeDiffSeconds() default -1;

    // 作业监控端口 建议配置作业监控端口, 方便开发者dump作业信息。使用方法: echo “dump” | nc 127.0.0.1 9888
    int monitorPort() default -1;

    // 作业分片策略实现类全路径 默认使用平均分配策略,可参考：http://elasticjob.io/docs/elastic-job-lite/02-guide/job-sharding-strategy/
    String jobShardingStrategyClass() default  StringPool.DEFAULT_JOB_STRATEGY_CLASS;

    // 修复作业服务器不一致状态服务调度间隔时间 配置为小于1的任意值表示不执行修复, 单位：分钟
    int reconcileIntervalMinutes() default 10;

    // 作业事件追踪的数据源Bean引用
    String eventTraceRdbDataSource() default "";

    // 设置作业是否启动时禁止 可用于部署作业时, 先在启动时禁止, 部署结束后统一启动.
    boolean disabled() default false;

    // 设置本地配置是否可覆盖注册中心配置 如果可覆盖, 每次启动作业都以本地配置为准.
    boolean overwrite() default true;

    //~~ LiteJobConfiguration 属性 END   ~~

    //~~ listener params begin ~~
    // 最后一个作业执行前的执行方法的超时时间。单位：毫秒 默认值：Long.MAX_VALUE
    long startedTimeoutMilliseconds() default Long.MAX_VALUE;

    // 最后一个作业执行后的执行方法的超时时间。单位：毫秒 默认值：Long.MAX_VALUE
    long completedTimeoutMilliseconds()  default Long.MAX_VALUE;

    //~~ listener params end   ~~

    // 注册中心服务Bean
    String register() default "zookeeperRegistryCenter";

    // 作业监听器 作业普通监听器
    String normalListener() default "";

    // 作业监听器 作业分布式监听器
    String distributedOnceListener() default "";

}
